#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int x,boss,hp,s,f=10;
typedef struct {//运用结构体 创建角色系统 角色血量和药剂量有所不同
    int hp;
	int s;
} Role;
go(){//前进指令
	int z;
	srand(time(NULL));
	z=rand()%100;
	if(z>40)
	{
		printf("一路上风平浪静，似乎什么都没有发生\n");
			Sleep(1500);
		x=x+1;
	}
	else if(z>20){
		printf("遭遇哥布林！你的团队血战！生命-20,收获战利品血瓶\n");
		Sleep(1500);
		hp=hp-20;
		s=s+1;
	}
	else
	{
		printf("你遇到了恶龙手下的埋伏，不得不后退,退回一千米稍作休整\n");
			Sleep(1500);
		x=x-1;
	}
}
rest(){//休息
	int z;
	srand(time(NULL));
	z=rand()%100;
	if(z>30)
	{
		printf("你原地休息，生命值大幅恢复!\n");
		hp=hp+50;
			Sleep(1500);
	}
	else if(z>20)
	{
		printf("你睡得很死！并没有发现偷袭，你逃走的时候已伤痕累累\n");
			Sleep(1500);
		hp=21;
		Sleep(1000);
		printf("你的血瓶被哥布林偷走啦！\n");
			Sleep(1500);
		 s=0;
		 printf("你退后了两千米！\n");
		 	Sleep(1500);
		 x=x-2;
	}
	else
	{
	printf("你睡得很轻，发现了偷袭，逃跑成功并退后一千米！\n");
		Sleep(1500);
	 x=x-1;
	}
}
find(){//附近寻找 宝藏
	int z;
	srand(time(NULL));
	z=rand()%100;
	if(z>70)
	{
		printf("遭遇怪兽，生命值-10，然而没有战利品\n");
		hp=hp-10;
	}
	else if(z>40)
	{
		printf("找到一个血瓶\n");
		s=s+1;
	}
	else if(z>20)
	{
		printf("找到一个钓竿\n");
		f=f+1;
	}
	else if(z>5)
	{
		printf("并没有什么新鲜东西，遗憾返回营地\n");
	 }
	 else
	 {
	 	printf("你竟发现直接传送到恶龙巢穴的传送门！\n");
	 	Sleep(1500);
	 	printf("被迫强制传送！\n");
	 	Sleep(1500);
		 x= boss;
	 }
}
xueping(){//使用血瓶恢复生命值
	if(s>0)
	{
	printf("成功使用血瓶\n");
	hp=hp+10;
	s=s-1;
   }
   if(s==0)
   printf("你没有剩余的血瓶！\n");
}
fish(){//钓鱼系统
  int z;
  srand(time(NULL));
  z=rand()%100;
  if(z>80)
  {
  	printf("你竟然钓到一个血瓶！\n");
  	s=s+1;
  	f=f-1;
   }
   else if(z>60)
   {
   	printf("你钓到了一条草鱼，你烤了，吃了，为你恢复了一点生命值\n");
	   hp=hp+2;
	   	f=f-1;
   }
   else if(z>40)
   {
   	printf("你掉到了一条胖鱼，你吃掉它，生命值扣了一点点\n");
	   hp=hp-1;
	   	f=f-1;
	}
	else if(z>5)
	{
		printf("你坐在河岸旁沉思，什么事都没有发生，浪费了点时间，所以你的生命值有所下降\n");
		Sleep(1000);
	    printf("时间就是生命！\n");
	    hp=hp-1;
	    	f=f-1;
	}
	else
	{
		printf("震惊！你在钓鱼的时候突然从湖里来了一个老头，并问你：\n");
		Sleep(1000);
		printf("年轻人，这个金钓竿是你的，还是银钓竿是你的，还是这个木制钓竿是你的？\n");
		int d;
		printf("1.金钓竿 2.银钓竿 3.木钓竿 4.都不是我的 5.别打扰老子钓鱼\n");
		scanf("%d",&d);
			if(d==1)
			{
				printf("老者将金钓竿赠于你,你获得了500点生命！\n");
				hp=hp+500;
			}
		else	if(d==2)
			{
				printf("老者将银钓竿赠于你，你获得了200点生命！\n");
				hp=hp+200;
			}
		else	if(d==3)
			{
				printf("你获得一个钓竿\n");
				f=f+1;
			}
		else	if(d==4)
			{
				printf("老者点点头很是欣慰，转头就走了\n");
				Sleep(1000);
				printf("对，你什么都没有获得。\n");
				Sleep(1000);
			}
		else	if(d==5)
			{
				printf("老者非常愤怒，一气之下利用降龙十八掌将你拍到对面的山头\n");
				printf("你粉身碎骨，已经断气了\n");
				hp=0 ;
			}
			else
			{
				printf("你说了一个不相关的回答，老者见你傻啦吧唧的\n");
				Sleep(2000);
				printf("可怜你的遭遇，便把他的毕生功力传授于你！\n");
				Sleep(3000);
				printf("是的，你无敌了！\n");
				hp=hp+9999;
			}
	}
}
void menu() {//游戏菜单
    printf("欢迎来到冒险游戏！\n");
    printf("1.开始新游戏\n");
    printf("2.读取存档\n");
    printf("3.保存游戏\n");
    printf("4.退出游戏\n");
    printf("5.游戏说明\n");
}
 void loadgame(){//加载游戏
FILE *fp;
  if((fp=fopen("save01.txt","r"))==NULL)
  {
  	printf("无法打开该文件");
	  exit(0) ;
  }
  fscanf(fp,"%d,%d,%d,%d",&x,&hp,&boss,&s);
  fclose(fp);
  printf("游戏进度加载成功！");
}
void savegame(){//保存游戏
  FILE *fp;
  if((fp=fopen("save01.txt","w"))==NULL)
  {
  	printf("无法打开该文件");
	  exit(0) ;
  }
  fprintf(fp,"%d,%d,%d,%d",x,hp,boss,s);
  fclose(fp);
  printf("游戏进度保存成功！");
}
void check(){//利用数组排序背包
	printf("该项会帮助你从小到大排序你的 钓竿数量 boss巢穴坐标 生命值 血瓶 前进的距离\n");
	int a[5],temp,v,b,z;
	a[0]=x;
	a[1]=boss;
	a[2]=hp;
	a[3]=s;
	a[4]=f;
	for( v=0;v<4;v++){
	for( b=0;b<4-v;b++)
	{
		if(a[b]>a[b+1])
		{
			temp=a[b];
			a[b]=a[b+1];
			a[b+1]=temp;
		}
	}
}
	for( z=0;z<5;z++)
	{
		printf("%d  ",a[z]);
	}
	printf("\n");
}
void gua(int &e){//利用地址传递值 完成开挂操作
	e=e+10000;
}
void background(){//背景故事
printf("故事发生在一个风雨交加的夜晚\n") ;
Sleep(1000);
printf("城堡中的公主被恶龙抓走了\n");
Sleep(1000);
printf("现在国王征集勇士讨伐恶龙，砍下龙头者将获得丰富的奖励，你是否选择参加？\n");
Sleep(1000);
printf("1.主动参与！ 2.拒绝参加！\n");
}
void stratgame(){//开始游戏
	background();
srand(time(NULL));
boss=rand()%10+10;//生成boss巢穴的距离
x=0;
int i;
scanf("%d",&i);
	do{ //小背景
if(i==1){
	printf("冒险开始\n"); break;
}
else if(i==2){
	printf("没有勇士参与讨伐恶龙，国王思考再三，决定谁救女儿回来，谁就是驸马\n");
	Sleep(2000);
	printf("条件诱人，你无法拒绝\n");
	Sleep(2000);
	break;
}
else
{
    printf("输入有误！,请重新选择！\n");
    scanf("%d",&i);
}
}while(i==1||i==2);//背景的一部分
	 printf("你参与到了讨伐恶龙的队伍，请你勇敢参战！解救公主！\n");
	 Sleep(1000);
	 printf("请选择你的职业：1.战士（血量高） 2.法师（血瓶多）\n") ;//选择职业
 int n;
scanf("%d",&n);
do{
if(n==1)
{
Role k={200,0};
hp=k.hp;
s=k.s;
break;
}
else if(n==2)
{
	Role f={150,5};
	hp=f.hp;
	s=f.s;
	break;
}
else
{
printf("输入有误，请重新输入！");
scanf("%d",&n);
}
}while(n==1||n==2);
  while(1){
  	printf("----------------------------------------------------------------\n");//状态条
  	printf("当前生命值；%d 距离恶龙；%d 千米，你现在拥有血瓶：%d，你拥有鱼竿：%d\n",hp,boss-x,s,f);
  	if(x>=boss) break;
	  if(hp<=0)
  	 {
  		printf("很遗憾！您的生命值已耗尽！\n");
		 break;
	  }
	  printf("请你选择当前行动；1.前进    2.原地休息 3.附近寻宝  4.使用血瓶\n");//进行操作指令
	  printf("                  5.保存进度 6.调取进度 7.湖中钓鱼 8.检查背包\n") ;
	  printf("                  9.不想丸辣，我要开挂！ \n");
	  int j;
     do{
     		  scanf("%d",&j);
     	if(j==1)
    {
		 go();
     	break;
    }
	    else if(j==2)
	{
		rest();
		break;
	}
        else if(j==3)
	{
		find();
		break;
	}
		else if(j==4)
    {
		 xueping();
		 break;
	}
     	else if(j==5)
	{
		savegame();
		break;
	 }
	 else if(j==6)
	 {
	 	loadgame();
	 	break;
	  }
	  else if(j==7)
	  {
	  	fish();
	  	break;
	  }
	  else if(j==8)
	  {
	  	check();
	  	break;
	   }
	   else if(j==9)
	   {
	   	printf("你想增加你的什么属性：1.生命 2.钓竿 \n");
	   	int o;
	   	scanf("%d",&o);
	   	if(o==1)
	   	{
	   		gua(hp);
	   		printf("已增加生命值！");
		   }
		else   if(o==2)
		   {
		   	gua(f);
		   	printf("已增加钓竿数量！");
		   }
		   else
		   {
		   	printf("输入有误！开挂失败！\n");
		   }
	   	break;
	   }
      else
	{
	printf("你的输入有误，请重新输入！\n");
	scanf("%d",&j);
	}
	  }while(j==1||j==2||j==3||j==4|j==5|j==6|j==7|j==8|j==9);
	  //达到特定条件 跳出循环（生命值过低或者已经接触boss）
      if(hp>0&&x>=boss)
      {
      	printf("您与恶龙遭遇，与之恶战!\n");
		  printf("生命值-150\n");
		  hp=hp-150;
		  if(hp>0)
		  {
		  	printf("勇士屠杀恶龙成功！游戏结束！\n");
		  	Sleep(2000);
		  	printf("你救回了公主！你和公主喜结连理，过上了幸福的生活");
			  Sleep(2000);
			  return;
		   }
		   else{
		   		printf("很遗憾！您的生命值已耗尽！\n");
		   		Sleep(2000);
		   }
	  }
	  if(hp<=0){
	  	printf("通关失败，再接再厉！\n");
		  return;
	  }
 
  }
}
void explain(){
	printf("在这个游戏里，你将会拯救被恶龙抓走的公主，你有很多选项可以选择\n");
	Sleep(1000);
	printf("你可以附近寻宝，也可靠近恶龙，积攒你的战力去击败恶龙吧！\n");
	Sleep(1000);
	printf("在这里生命值是你最重要的属性，你必须保证你的生命值健康，才能够击败恶龙.\n");
	Sleep(1000);
	printf("我还在游戏中设置了一些彩蛋，耐心找找吧\n");
}
int main() {
	int data;
printf("作者：622寝室\n");
while (data!= 4) {
        menu();
        printf("请输入你的选择：");
        scanf("%d", &data);
        switch (data) {
            case 1:
                 stratgame();
                break;
            case 2:
                loadgame();
                break;
            case 3:
                savegame();
                break;
            case 4:
                printf("谢谢游玩！\n");
                break;
            case 5:
                explain();
               	break;
                break;
            default:
                printf("无效的选择，请重新输入！\n");
                break;
        }
    }
	return 0;
}